package com.atguigu.redislock.mylock;

import cn.hutool.core.util.IdUtil;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.locks.Lock;


/**
 * 分布式锁工厂类，用于创建不同类型的分布式锁
 * @author 38131
 */
@Component
public class DistributedLockFactory
{
    // 注入StringRedisTemplate，用于操作Redis
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    // 锁的名称，用于标识锁
    private String lockName;
    // 当前锁的唯一标识
    private String uuid;
    
    /**
     * 构造函数，初始化uuid
     */
    public DistributedLockFactory()
    {
        this.uuid = IdUtil.simpleUUID();
    }
    
    /**
     * 根据锁类型获取分布式锁实例
     *
     * @param lockType 锁的类型，如"REDIS", "ZOOKEEPER", "MYSQL"
     * @return 根据锁类型返回相应的分布式锁实例，如果锁类型不支持或出错，则返回null
     */
    public Lock getDistributedLock(String lockType)
    {
        // 参数校验，如果lockType为空，则直接返回null
        if(lockType == null) {
            return null;
        }
        
        // 根据锁类型创建并返回相应的分布式锁实例
        if(lockType.equalsIgnoreCase("REDIS")){
            this.lockName = "zzyyRedisLock";
            return new RedisDistributedLock(stringRedisTemplate,lockName,uuid);
        }else if(lockType.equalsIgnoreCase("ZOOKEEPER")){
            this.lockName = "zzyyZookeeperLockNode";
            // TODO: 实现ZooKeeper版本的分布式锁
            return null;
        }else if(lockType.equalsIgnoreCase("MYSQL")){
            // TODO: 实现MySQL版本的分布式锁
            return null;
        }
        
        // 如果锁类型不匹配任何已实现的分布式锁类型，则返回null
        return null;
    }
}
